function u2b(str) {
    var data = '';
    for(var i=0; i<str.length; ++i) {
        if(str.charAt(i) < '\x80') {
            data += str.charAt(i);
            continue;
        }
        var charCodeStr = str.charCodeAt(i).toString(16).toUpperCase();
        charCodeStr = 'x' + ('000' + charCodeStr).substr(-4);
        if(u2bTab[charCodeStr])
            data += u2bTab[charCodeStr];
        else // Not a big5 char
            data += '\xFF\xFD';
    }
    return data;
}

function b2u(data) {
    var str = '';
    for(var i=0; i<data.length; ++i) {
        if(data.charAt(i) < '\x80' || i == data.length-1) {
            str += data.charAt(i);
            continue;
        }

        var b5index = 'x' + data.charCodeAt(i).toString(16).toUpperCase() + 
                            data.charCodeAt(i+1).toString(16).toUpperCase();
        if(b2uTab[b5index]) {
            str += b2uTab[b5index];
            ++i;
        } else { // Not a big5 char
            str += data.charAt(i);
        }
    }
    return str;
}
